package problems.daily.y2021m7;

import java.util.HashSet;
import java.util.Set;

/**
 * @author habitplus
 * @since 2021-07-15 12:13
 */
public class T20210715N4 {
    // 3. 无重复字符的最长子串
    // 给定一个字符串 s，请你找出其中不含有重复字符的 最长子串 的长度。
    //
    // 提示：
    //      0 <= s.length <= 5 * 104
    //      s 由英文字母、数字、符号和空格组成
    public int lengthOfLongestSubstring(String s) {
        // 滑动窗口
        if (s == null || s.length() == 0) {
            return 0;
        }

        int j = 0;
        char[] chs = s.toCharArray();
        int ans = 0;
        Set<Character> set = new HashSet<>();

        // 枚举各个位置的最长无重复子串
        for (int i = 0; i < chs.length; i++) {
            // 上一个位置的字符移除
            if (i != 0) {
                set.remove(chs[i - 1]);
            }
            // 计算当前字符起的最长子串
            while (j < chs.length && !set.contains(chs[j])) {
                set.add(chs[j]);
                j++;
            }
            ans = Math.max(set.size(), ans);
        }

        return ans;
    }
}
